package aco;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;


public class Parse {

//	类里面存储命令行
    static class OptComparator implements Comparator<Option> {
//		这个映射应该是储存，cmd命令的
		Map<String, Integer> opt = new HashMap<String, Integer>();
	
		public OptComparator() {
		    int i = 0;
		    opt.put("u", i++);
		    opt.put("z", i++);
		}
	
//		比较方法，应该比较命令的优先级
		@Override
		public int compare(Option o1, Option o2) {
		    if (o1.getValue() == null || o2.getValue() == null) return 0;
		    else
		    	return (opt.get(o1.getOpt()) - opt.get(o2.getOpt()));
		}
    }

	/**
	 * 解析命令行语句(u, z)
	 * @param args：这个数组用来接受命令行的参数
	 * @param runNumber：运行次数
	 */
    static void parse_commandline(String args[], int runNumber) {

//    	1. 如果命令行为空，说明没有命令，则退出系统
		if (args.length == 0) {
		    System.err.println("No options are specified.");
		    System.err.println("Try `--help' for more information.");
		    System.exit(1);
		}

//		2. 如果命令行有命令，则进行解析执行
//		Options应该是Option类，或者集合，下面的语言是在options中加入option
//		如果是u,则执行as,如果是z执行acs
		Options options = new Options();
		options.addOption("u", "as", false, "apply basic Ant System");
		options.addOption("z", "acs", false, "apply ant colony colony system");
	
		CommandLine cmd = null;
		CommandLineParser parser = new BasicParser();
		try {
		    cmd = parser.parse(options, args); // 获取命令行
		} catch (ParseException e) {
		    System.err.println("Error: " + e.getMessage());
		    System.exit(1);
		}


//		3. 根据命令行语句,初始化参数
		// Choice of ONE algorithm
		int algorithmCount = 0; //	这个代表优化的次数,用蚂蚁系统或者蚁群系统,都是一次优化
		if (cmd.hasOption("u")) {
		    algorithmCount++;
		}
		if (cmd.hasOption("z")) {
		    algorithmCount++;
		}
		if (algorithmCount > 1) { // 不能两次优化,如果进行了两次优化,就失败了,退出系统
		    System.err.println("Error: More than one ACO algorithm enabled in the command line.");
		    System.exit(1);
		} else if (algorithmCount == 1) { // 如果已经优化了一次,后面就不能再优化了
		    Ants.as_flag = false;
		    Ants.acs_flag = false;
		}
	
		if (cmd.hasOption("u")) {
		    Ants.as_flag = true;
		    InOut.set_default_as_parameters();
		    System.out.println("\nRun basic Ant System #" + (runNumber + 1));
		}
		if (cmd.hasOption("z")) {
		    Ants.acs_flag = true;
		    InOut.set_default_acs_parameters();
		    System.out.println("\nRun Ant Colony System #" + (runNumber + 1));
		}
    }
}